package com.jia.leetCode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

/**
 * 
 * 379. 电话目录管理系统
 * 
 * 
 * 设计一个电话目录管理系统，让它支持以下功能：

get: 分配给用户一个未被使用的电话号码，获取失败请返回 -1
check: 检查指定的电话号码是否被使用
release: 释放掉一个电话号码，使其能够重新被分配
示例:

// 初始化电话目录，包括 3 个电话号码：0，1 和 2。
PhoneDirectory directory = new PhoneDirectory(3);

// 可以返回任意未分配的号码，这里我们假设它返回 0。
directory.get();

// 假设，函数返回 1。
directory.get();

// 号码 2 未分配，所以返回为 true。
directory.check(2);

// 返回 2，分配后，只剩一个号码未被分配。
directory.get();

// 此时，号码 2 已经被分配，所以返回 false。
directory.check(2);

// 释放号码 2，将该号码变回未分配状态。
directory.release(2);

// 号码 2 现在是未分配状态，所以返回 true。
directory.check(2);

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/design-phone-directory
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author Administrator
 *
 */
public class Pro0379 {
		List<Integer> nums = new ArrayList<Integer>();
		Set<Integer> set = new HashSet<Integer>();
	    /** Initialize your data structure here
	    @param maxNumbers - The maximum numbers that can be stored in the phone directory. */
		public Pro0379(int maxNumbers) {
			if(maxNumbers <=0) throw new RuntimeException("maxNumbers input error.");
			for(int i = 0; i < maxNumbers; i++) {
				nums.add(i);
			}
		}
		
		/** Provide a number which is not assigned to anyone.
		    @return - Return an available number. Return -1 if none is available. */
		public int get() {
		    if(nums.size() == 0) return -1;
		    Integer phoneNum = nums.remove(nums.size() - 1);
		    set.add(phoneNum);
		    return phoneNum;
		}
		
		/** Check if a number is available or not. */
		public boolean check(int number) {
		    return !set.contains(number) && nums.contains(number);
		}
		
		/** Recycle or release a number. */
		public void release(int number) {
		    set.remove(number);
		    if(!nums.contains(number)) {
		    	nums.add(number);
		    }
		}
}
